function ValidarEmail (Email: String): Boolean;
var
  i, j, tam_email, simb_arroba, simb_arroba2, qtd_arroba, qtd_pontos, qtd_pontos_esq, qtd_pontos_dir, posicao, posicao2, ponto, ponto2: Integer;
  vet_email: Array [0..49] of String;
  msg: String;
begin
  qtd_pontos := 0;
  qtd_pontos_esq := 0;
  qtd_pontos_dir := 0;
  qtd_arroba := 0;
  posicao := 0;
  posicao2 := 0;
  simb_arroba := 0;
  simb_arroba2 := 0;
  ponto := 0;
  ponto2 := 0;
  msg := '';
  Result := True;
  //Verificando parte inicial do E-mail
  tam_email := Length (Email);
  for i := 0 to tam_email - 1 do
  begin
    vet_email[i] := Copy (Email, i + 1, 1);
    if vet_email[i] = '@' then
    begin
      inc (qtd_arroba);
      posicao := i;
    end;
  end;
  if ((vet_email[0] = '@') or (vet_email[0] = '.') or (vet_email[0] = '-')) then
  begin
    Result := False;
    msg := msg1;
  end;
  //Verificando se tem o smbolo @ e quantos tem
  if qtd_arroba < 1 then
  begin
    Result := False;
    msg := msg2;
  end
  else if qtd_arroba > 1 then
  begin
    Result := False;
    msg := msg3 + ' Encontrado(s): ' + IntToStr (qtd_arroba);
  end
  else //Verificando o que vem antes e depois do smbolo @
  begin
    for i := 0 to 35 do
    begin
      if vet_email[posicao - 1] <> vet_valido[i] then
        inc (simb_arroba)
      else
        dec (simb_arroba);
      if vet_email[posicao + 1] <> vet_valido[i] then
        inc (simb_arroba2)
      else
        dec (simb_arroba2);
    end;
    if simb_arroba = 36 then
    begin
      //Antes do arroba h um smbolo desconhecido do vetor vlido
      Result := False;
      msg := msg4;
    end
    else
      if simb_arroba2 = 36 then
      begin
        //Depois do arroba h um smbolo desconhecido do vetor vlido
        Result := False;
        msg := msg5;
      end
  end;
  //Verificando se h pontos e quantos, e Verificando parte final do e-mail
  for j := 0 to tam_email - 1 do
    if vet_email[j] = '-' then
      if ((vet_email[j - 1] = '.') or (vet_email[j - 1] = '-')) then
      begin
        Result := False;
        msg := msg6;
      end;
  for i := 0 to tam_email - 1 do
    if vet_email[i] = '.' then
    begin
      inc (qtd_pontos);
      posicao2 := i + 1;
      if i > posicao then
        inc (qtd_pontos_dir)
      else
        inc (qtd_pontos_esq);
      if ((vet_email[i - 1] = '.') or (vet_email[i - 1] = '-')) then
      begin
        Result := False;
        msg := msg6;
      end;
    end;
  if qtd_pontos < 1 then
  begin
    Result := False;
    msg := msg7;
  end
  else if vet_email[tam_email - 1] = '.' then
  begin
    Result := False;
    msg := msg8;
  end
  else if vet_email[tam_email - 2] = '.' then
  begin
    Result := False;
    msg := msg9;
  end
  else if qtd_pontos_dir > 2 then
  begin
    Result := False;
    msg := msg10 + ' Encontrado(s): ' + IntToStr (qtd_pontos) + #10 + 'Encontrado(s) a direita do @: ' + IntToStr (qtd_pontos_dir);
  end
  else if (not ((((tam_email - posicao2) = 3) and (qtd_pontos_dir = 1)) or (((tam_email - posicao2) = 2) and (qtd_pontos_dir = 2)) or (((tam_email - posicao2) = 2) and (qtd_pontos_dir = 1)))) then
  begin
    Result := False;
    msg := msg11 + #10 + 'Encontrado(s) a esquerda do @: ' + IntToStr (qtd_pontos_esq) + #10 + 'Encontrado(s) a direita do @: ' + IntToStr (qtd_pontos_dir);
  end
  else
  //Verificando o que vem antes e depois do ponto
  begin
    for i := 0 to 35 do
    begin
      if vet_email[posicao2-2] <> vet_valido[i] then
        inc (ponto)
      else
        dec (ponto);
      if vet_email[posicao2] <> vet_valido[i] then
        inc (ponto2)
      else
        dec (ponto2);
    end;
    if ponto = 36 then
    begin
      //Antes do ponto h um smbolo desconhecido do vetor vlido
      Result := False;
      msg := msg12;
    end
    else if ponto2 = 36 then
    begin
      //Depois do ponto h um smbolo desconhecido do vetor vlido
      Result := False;
      msg := msg13;
    end
  end;
  //Verificao final
  if not Result then
  begin
    msg := msg + #10 + 'Formato de E-mail invlido';
    MsgErro (msg, 'Erro');
  end;
end;